<?php 
class Pedido extends AppModel {
    var $name = 'Pedido';
 
    // estas validaciones son para medios de pago, pero necesita hacerlas en este modelo
    var $validate = array(
        'importe' => array(
            'regla1' => array(
                // valida que el numero sea un valor monetario
                'rule'    => array('money', 'left'),
                'allowEmpty' => false,
                'message' => 'El importe no es un valor válido.'),
            'regla2' => array(
                'rule'    => 'superaSaldoFactura',
                'message' => 'El importe no puede superar el saldo pendiente de la factura.')
        ),
        'medio_pago' => array(            
            // valida que el numero sea un valor monetario
            'rule' => 'notEmpty',
            'allowEmpty' => false,
            'message' => 'Elija un medio de pago.'
        ),
        'fecha_desde' => array(            
            'rule' => 'notEmpty',
            'allowEmpty' => false,
            'message' => 'Seleccione una fecha inicial.'
        ),
        'fecha_hasta' => array(            
            'rule' => 'notEmpty',
            'allowEmpty' => false,
            'message' => 'Seleccione una fecha final.'
        ),
        'corte_facturacion' => array(            
            'rule' => 'notEmpty',
            'allowEmpty' => false,
            'message' => 'Seleccione una opción de corte para el reporte.'
        ),
        'rubro_id_sel' => array(            
            'rule' => 'notEmpty',
            'allowEmpty' => false,
            'message' => 'Debe seleccionar al menos un rubro.'
        )        
    );
       
 /**
 * Overridden paginate method - group by week, away_team_id and home_team_id
 */
    public function paginate($conditions, $fields, $order, $limit = 5, $page = 1, $recursive = null, $extra = array()) {
        $recursive = -1;

        $results = $this->getDatosListado($conditions);

        $pos_ini = $limit * ($page - 1);
        $pos_actual = 0;
        $entra = 0;
        $resultado_paginado = array();

        if (!empty($results)) {
            foreach($results as $value):
                if($pos_actual == $pos_ini) $entra = 1;
                if($pos_actual == ($pos_ini + $limit)) $entra = 0;

                if($entra == 1) {
                    array_push ($resultado_paginado, $value);
                }
                $pos_actual++;
            endforeach;
        } else { $resultado_paginado = $results; }
        
        return $resultado_paginado;
    } 

    public function paginateCount($conditions = null, $recursive = 0, $extra = array()) {
    // method body
        return count($this->getDatosListado($conditions));
    }
    
    function getDatosListado($condiciones) {    
        $pedidoagregado = ClassRegistry::init('PedidoAgregado'); 
        $pedidomesa = ClassRegistry::init('PedidoMesa'); 
        $parametro = ClassRegistry::init('Parametro');
        
        $paga_cubierto = $parametro->find('first', array('conditions' => array('Parametro.param_nombre' => 'paga_cubierto'),'fields' => array('Parametro.valor')));
        $precio_uni_cubierto = $parametro->find('first', array('conditions' => array('Parametro.param_nombre' => 'precio_cubierto'),'fields' => array('Parametro.valor')));
        
        $campos = array('Pedido.id', 'Pedido.fecha', 'SUM(IFNULL(Detalle.precio * Detalle.cantidad, 0)) AS importe_detalles', 
                        'Pedido.cerrado', 'Pedido.facturado', 'Pedido.cancelado', 'Pedido.paga_cubierto', 'Pedido.precio_uni_cubierto',
                        'Pedido.cant_clientes', 'User.id', 'User.nombre', 'Pedido.descuento_id', 'Descuento.porcentaje');
        $joins = array(
                    array('table' => 'users', 'alias' => 'User', 'type' => 'INNER',
                            'conditions' => array('User.id = Pedido.user_id')),
                    array('table' => 'pedidodetalles', 'alias' => 'Detalle', 'type' => 'LEFT OUTER',
                            'conditions' => array('Detalle.pedido_id = Pedido.id', 'Detalle.cancelado IS NULL')),
                    array('table' => 'descuentos', 'alias' => 'Descuento', 'type' => 'LEFT OUTER',
                            'conditions' => array('Descuento.id = Pedido.descuento_id'))
                    );
        $orden = array('Pedido.fecha ASC');
        $agrupar = array('Pedido.id', 'Pedido.fecha','Pedido.cerrado', 'Pedido.facturado', 'Pedido.cancelado', 
                        'Pedido.paga_cubierto', 'Pedido.precio_uni_cubierto', 'Pedido.cant_clientes', 'User.id', 'User.nombre');

        $pedidos = $this->find('all', array('conditions' => $condiciones, 'order' => $orden, 'fields' => $campos, 'joins' => $joins, 'group' => $agrupar));        

        $cant_pedidos = count($pedidos);
        if($cant_pedidos > 0) {
            // obtengo los agregados de los platos aparte porque no puedo hacer agrupacion de platos y agregados al mismo tiempo
            $campos = array('Pedido.id', 'Pedido.fecha', 'SUM(IFNULL(PedidoAgregado.precio * PedidoDetalle.cantidad, 0)) AS importe_agregados');
            $joins = array(
                        array('table' => 'pedidodetalles', 'alias' => 'PedidoDetalle', 'type' => 'INNER',
                                'conditions' => array('PedidoDetalle.id = PedidoAgregado.pedido_detalle_id')),
                        array('table' => 'pedidos', 'alias' => 'Pedido', 'type' => 'INNER',
                                'conditions' => array('Pedido.id = PedidoDetalle.pedido_id'))
                        );
            $agrupar = array('Pedido.id', 'Pedido.fecha');
            $condiciones['PedidoDetalle.cancelado'] = null;
            $agregados = $pedidoagregado->find('all', array('conditions' => $condiciones, 'order' => $orden, 'fields' => $campos, 'joins' => $joins, 'group' => $agrupar));

            for($i=0;$i < $cant_pedidos; $i++) {
                if($pedidos[$i]['Pedido']['facturado'] == 0) {
                    $pedidos[$i]['Pedido']['paga_cubierto'] = $paga_cubierto['Parametro']['valor'];
                    $pedidos[$i]['Pedido']['precio_uni_cubierto'] = $precio_uni_cubierto['Parametro']['valor'];
                }       
                $pedidos[$i][0]['importe_agregados']=0;
                foreach($agregados as $item_agregado):
                    if ($pedidos[$i]['Pedido']['id']==$item_agregado['Pedido']['id']) {
                        $pedidos[$i][0]['importe_agregados']=$item_agregado[0]['importe_agregados'];
                    }
                endforeach;       
                $pedidos[$i][0]['mesas'] = $pedidomesa->getPedidoMesasLista($pedidos[$i]['Pedido']['id']);
            }   
            
        }
        return $pedidos;
    }   
    
    function getPedidoDetalle($id) {    
        $pedidodetalle = ClassRegistry::init('PedidoDetalle');
        $pedidoagregado = ClassRegistry::init('PedidoAgregado'); 
        $pedidomesa = ClassRegistry::init('PedidoMesa'); 
        $parametro = ClassRegistry::init('Parametro');
        
        $paga_cubierto = $parametro->find('first', array('conditions' => array('Parametro.param_nombre' => 'paga_cubierto'),'fields' => array('Parametro.valor')));
        $precio_uni_cubierto = $parametro->find('first', array('conditions' => array('Parametro.param_nombre' => 'precio_cubierto'),'fields' => array('Parametro.valor')));
       
        // obtengo los datos de cabecera del pedido
        $campos = array('Pedido.id', 'Pedido.fecha', 'Pedido.cerrado', 'Pedido.facturado', 'Pedido.cancelado', 'Pedido.paga_cubierto', 
                        'Pedido.precio_uni_cubierto', 'Pedido.cant_clientes', 'User.nombre', 
                        'Pedido.descuento_id', 'Descuento.porcentaje');
        $joins = array(
                    array('table' => 'users', 'alias' => 'User', 'type' => 'INNER',
                            'conditions' => array('User.id = Pedido.user_id')),
                    array('table' => 'descuentos', 'alias' => 'Descuento', 'type' => 'LEFT OUTER',
                            'conditions' => array('Descuento.id = Pedido.descuento_id'))
                    );
        $condiciones = array('Pedido.id' => $id);
        $pedido = $this->find('all', array('conditions' => $condiciones, 'fields' => $campos, 'joins' => $joins));

        // obtengo los datos de platos del pedido
        $campos = array('PedidoDetalle.id', 'Producto.codigo', 'Producto.descripcion', 'PedidoDetalle.cantidad', 'PedidoDetalle.precio', 
                        'PedidoDetalle.estado', 'PedidoDetalle.cancelado');
        $joins = array(
                    array('table' => 'productos', 'alias' => 'Producto', 'type' => 'INNER',
                            'conditions' => array('Producto.id = PedidoDetalle.producto_id'))
                    );
        $condiciones = array('PedidoDetalle.pedido_id' => $id);
        $detalles = $pedidodetalle->find('all', array('conditions' => $condiciones, 'fields' => $campos, 'joins' => $joins));

        $detalle_ids = array();
       
        // acumulo los importes que no están cancelados para los totales
        $impo_total_detalles = 0;
        foreach($detalles as $item):
            array_push($detalle_ids, $item['PedidoDetalle']['id']);            
            if ($item['PedidoDetalle']['cancelado']==null) $impo_total_detalles += $item['PedidoDetalle']['precio'] * $item['PedidoDetalle']['cantidad'];
        endforeach;       
       
        // obtengo los agregados de los platos
        $campos = array('PedidoAgregado.id', 'Agregado.codigo', 'Agregado.descripcion', 'Agregado.tipo', 'PedidoDetalle.cancelado',
                        'PedidoDetalle.cantidad', 'PedidoAgregado.precio', 'PedidoDetalle.estado', 'PedidoAgregado.pedido_detalle_id');
        $joins = array(
                    array('table' => 'pedidodetalles', 'alias' => 'PedidoDetalle', 'type' => 'INNER',
                            'conditions' => array('PedidoDetalle.id = PedidoAgregado.pedido_detalle_id')),
                    array('table' => 'agregados', 'alias' => 'Agregado', 'type' => 'INNER',
                            'conditions' => array('Agregado.id = PedidoAgregado.agregado_id'))
                    );
        $condiciones = array('PedidoAgregado.pedido_detalle_id' => $detalle_ids);
        $agregados = $pedidoagregado->find('all', array('conditions' => $condiciones, 'fields' => $campos, 'joins' => $joins));

        $impo_total_agregados = 0;
        foreach($agregados as $item):
            if ($item['PedidoDetalle']['cancelado']==null) $impo_total_agregados += $item['PedidoAgregado']['precio'] * $item['PedidoDetalle']['cantidad'];
        endforeach;  

        if($pedido[0]['Pedido']['facturado'] == 0) {
            $pedido[0]['Pedido']['paga_cubierto'] = $paga_cubierto['Parametro']['valor'];
            $pedido[0]['Pedido']['precio_uni_cubierto'] = $precio_uni_cubierto['Parametro']['valor'];
        }       
        $pedido[0]['Pedido']['impo_total_detalles'] = $impo_total_detalles;
        $pedido[0]['Pedido']['impo_total_agregados'] = $impo_total_agregados;
        $pedido[0]['Pedido']['mesas'] = $pedidomesa->getPedidoMesasLista($pedido[0]['Pedido']['id']);  
        
        $resultado['Cabecera'] = $pedido[0];
        $resultado['Detalle'] = $detalles;
        $resultado['Agregado'] = $agregados;
        
        return $resultado;
    }
    
    function getPedidoPago($id) {    
        $parametro = ClassRegistry::init('Parametro');
        $pedidodetalle = ClassRegistry::init('PedidoDetalle');
        $agregado = ClassRegistry::init('Agregado');
        $pedidoagregado = ClassRegistry::init('PedidoAgregado'); 
        $pedidovalor = ClassRegistry::init('PedidoValor'); 

        $paga_cubierto = $parametro->find('first', array('conditions' => array('Parametro.param_nombre' => 'paga_cubierto'),'fields' => array('Parametro.valor')));
        $precio_uni_cubierto = $parametro->find('first', array('conditions' => array('Parametro.param_nombre' => 'precio_cubierto'),'fields' => array('Parametro.valor')));        

        $campos = array('Pedido.id', 'Pedido.fecha', 'Pedido.cerrado', 'Pedido.facturado', 'Pedido.cancelado', 'Pedido.paga_cubierto', 
                        'Pedido.precio_uni_cubierto', 'Pedido.cant_clientes',
                        'Pedido.descuento_id', 'Descuento.porcentaje');
        $joins = array(
                    array('table' => 'descuentos', 'alias' => 'Descuento', 'type' => 'LEFT OUTER',
                            'conditions' => array('Descuento.id = Pedido.descuento_id'))
                    );
        $condiciones = array('Pedido.id' => $id);
        $pedido = $this->find('all', array('conditions' => $condiciones, 'fields' => $campos, 'joins' => $joins));
        
        // obtengo los datos de platos del pedido
        $campos = array('PedidoDetalle.id', 'PedidoDetalle.cantidad', 'PedidoDetalle.precio', 'PedidoDetalle.estado', 'PedidoDetalle.cancelado');
        $condiciones = array('PedidoDetalle.pedido_id' => $id);
        $detalles = $pedidodetalle->find('all', array('conditions' => $condiciones, 'fields' => $campos));

        $detalle_ids = array();
       
        // acumulo los importes que no están cancelados para los totales
        $impo_total_detalles = 0;
        foreach($detalles as $item):
            array_push($detalle_ids, $item['PedidoDetalle']['id']);            
            if ($item['PedidoDetalle']['cancelado']==null) $impo_total_detalles += $item['PedidoDetalle']['precio'] * $item['PedidoDetalle']['cantidad'];
        endforeach;       
       
        // obtengo los agregados de los platos
        $campos = array('PedidoAgregado.id', 'PedidoDetalle.cancelado', 'PedidoDetalle.cantidad', 'PedidoAgregado.precio', 'PedidoDetalle.estado', 
                        'PedidoAgregado.pedido_detalle_id');
        $joins = array(
                    array('table' => 'pedidodetalles', 'alias' => 'PedidoDetalle', 'type' => 'INNER',
                            'conditions' => array('PedidoDetalle.id = PedidoAgregado.pedido_detalle_id'))
                    );
        $condiciones = array('PedidoAgregado.pedido_detalle_id' => $detalle_ids);
        $agregados = $pedidoagregado->find('all', array('conditions' => $condiciones, 'fields' => $campos, 'joins' => $joins));

        $impo_total_agregados = 0;
        foreach($agregados as $item):
            if ($item['PedidoDetalle']['cancelado']==null) $impo_total_agregados += $item['PedidoAgregado']['precio'] * $item['PedidoDetalle']['cantidad'];
        endforeach;       

        $pedido[0]['Pedido']['paga_cubierto'] = $paga_cubierto['Parametro']['valor'];
        $pedido[0]['Pedido']['precio_uni_cubierto'] = $precio_uni_cubierto['Parametro']['valor'];
        
        $pedido[0]['Pedido']['impo_total_detalles'] = $impo_total_detalles;
        $pedido[0]['Pedido']['impo_total_agregados'] = $impo_total_agregados;
        
        // obtengo los datos de medios de pago si ya fue facturado
        $campos = array('PedidoValor.id', 'PedidoValor.medio_pago', 'PedidoValor.importe');
        $condiciones = array('PedidoValor.pedido_id' => $id);
        $valores = $pedidovalor->find('all', array('conditions' => $condiciones, 'fields' => $campos));

        $impo_total_valores = 0;
        foreach($valores as $item):
            $impo_total_valores += $item['PedidoValor']['importe'];
        endforeach;       
        
        $pedido[0]['Pedido']['impo_total_valores'] = $impo_total_valores;
        
        $resultado['Cabecera'] = $pedido[0];
        $resultado['Valor'] = $valores;
        
        return $resultado;
    }

    public function obtenerRankingProductos($condiciones) {       
        $parametro = ClassRegistry::init('Parametro');

        $cant_productos = $parametro->find('first', array('conditions' => array('Parametro.param_nombre' => 'cant_prod_ranking'),
                                                            'fields' => array('Parametro.valor')));
        
        $resultado = array();
               
        $campos = array('Producto.id', 'Producto.descripcion', 'SUM(PedidoDetalle.cantidad) AS cantidad');
        $joins = array(
                    array('table' => 'pedidodetalles', 'alias' => 'PedidoDetalle', 'type' => 'INNER',
                            'conditions' => array('PedidoDetalle.pedido_id = Pedido.id', 'PedidoDetalle.cancelado IS NULL')),
                    array('table' => 'productos', 'alias' => 'Producto', 'type' => 'INNER',
                            'conditions' => array('Producto.id = PedidoDetalle.producto_id')),
                    array('table' => 'subrubros', 'alias' => 'Subrubro', 'type' => 'INNER',
                            'conditions' => array('Subrubro.id = Producto.subrubro_id'))
                    );
        $grupo = array('Producto.id', 'Producto.descripcion');
        $orden = array('cantidad DESC');
                
        $filtros = array('Pedido.fecha BETWEEN ? AND ?' => array($condiciones['fecha_desde'],$condiciones['fecha_hasta']), 
                        'Subrubro.rubro_id' => $condiciones['rubro_id_sel']);
        
        $resultado = $this->find('all', array('conditions' => $filtros, 'group' => $grupo, 'fields' => $campos, 'order' => $orden, 'joins' => $joins));        
                
        $datos = array();
        
        $i = 0;
        while(($i < $cant_productos['Parametro']['valor']) && ($i < count($resultado)) ) {
            array_push($datos, $resultado[$i]);
            $i++;
        }
        // completo los espacios que quedaron
        while($i < $cant_productos['Parametro']['valor']) {
            array_push($datos, array('Producto' => array('id' => 0, 'descripcion' => ''), '0' => array('cantidad' => '')));
            $i++;
        }
        
        return $datos;
    }
   
}
?>
